﻿using System;
using System.Collections.Generic;
using System.Text;
using IWshRuntimeLibrary;

namespace RunAsAdministrator
{
    public class Program
    {
        static IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShellClass();
        public static void Main(string[] args)
        {
            try
            {
                if (args == null || args.Length == 0)
                {
                    usage();
                    return;
                }

                // 如果第一个参数是  /exe ，那么是打开程序
                if ("/exec".Equals(args[0], StringComparison.OrdinalIgnoreCase))
                {
                    if (args.Length == 1)
                    {
                        // 没有路径
                        return;
                    }
                    string path = args[1];
                    string pureName;
                    string param = GetParam(path, out pureName);
                    System.Diagnostics.Process.Start(pureName, param);
                    return;
                }
                else
                {
                    // 创建快捷方式
                    foreach (string item in args)
                    {
                        CreateDesktopLnk(item);
                    }
                }
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex.Message);
                //Console.WriteLine(ex.StackTrace);
                System.Windows.Forms.MessageBox.Show(ex.Message, "Error");
            }
            //Console.ReadLine();
        }

        private static string GetParam(string filename, out string pureName)
        {
            string param = null;
            pureName = null;

            if (string.IsNullOrEmpty(filename))
            {
                return param;
            }

            // 可能包含参数
            int index = filename.IndexOf(".exe");
            if (index != -1)
            {
                // 包含空格
                pureName = filename.Substring(0, index) + ".exe";
                param = filename.Substring(index + 4);
            }else
            {
                // 处理快捷方式，读取快捷方式的目标文件
                index = filename.IndexOf(".lnk");
                if (index != -1)
                {
                    IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(
                    // 包含空格
                    pureName = filename.Substring(0, index) + ".exe";
                    param = filename.Substring(index + 4);
                }
            }

            return param;
        }


        private static void CreateDesktopLnk(string filename)
        {
            if (string.IsNullOrEmpty(filename))
            {
                return;
            }

            // 可能包含参数
            string pureName;

            string param = GetParam(filename, out pureName);


            System.IO.FileInfo file = new System.IO.FileInfo(pureName);


            string DesktopPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);//得到桌面文件夹
            

            IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(DesktopPath + "\\" + file.Name + ".lnk");
            shortcut.TargetPath = System.Windows.Forms.Application.ExecutablePath;
            shortcut.Arguments = string.Format("/exec \"{0} {1}\"", file.FullName, param);// 参数
            shortcut.Description = "以管理员身份运行" + file.Name;
            shortcut.WorkingDirectory = file.DirectoryName;//程序所在文件夹，在快捷方式图标点击右键可以看到此属性
            shortcut.IconLocation = string.Format("{0}, 0", file.FullName); //图标
            //shortcut.Hotkey = "CTRL+SHIFT+Z";//热键
            shortcut.WindowStyle = 1;
            shortcut.Save();
        }

        private static void usage()
        {
            string str = @"

说明：
    1 将程序直接拖到此程序上，会自动在系统桌面上创建快捷方式
    2 如果要通过此程序运行程序，那么需要创建此程序的快捷方式，并传参数： /exec  要运行的文件路径

注意：
    1 目前仅支持exe程序，即路径中必须包含扩展名 .exe
    2 程序文件路径使用引号("")包含，如果有目标程序需要参数，则也需要被包含在内

示例：  
    RunAsAdmin.exe /exec ""C:\Windows\notepad.exe""
    RunAsAdmin.exe /exec ""C:\Windows\notepad.exe D:\test.txt""
    RunAsAdmin.exe /exec ""C:\Windows\System32\cmd.exe /C /Q""

关于：
    更多信息请访问 http://www.hyjiacan.com/post/runasadministrator
    欢迎加入Javascript QQ群： 187786345
";
            System.Windows.Forms.MessageBox.Show(str, "使用说明");
        }
    }
}
